/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package hj4;

/**
 *
 * ALGORITMOS Y ESTRUCTURA DE DATOS
 * SECCION 10
 * CATEDRATICO ING. ROBLES FLORES
 * HOJA DE TRABAJO 4
 *  
 * YUCELY BEB     12537
 * MARCOS LOPEZ    12519
 * VICTOR FUENTES 12298
 */
import java.util.*;
public class PostfixEncDoble extends Resultado{
     StringBuffer linea;  
     ListaDoble pila;//instanciar objeto tipo pila
     ListaDoble aux;//instanciar objeto tipo pila axuliar
     //Pila resultado;//pila para los resulados
     int largo;//largo del stringbuffer de la driverhj2
     String caracter;//el caracter actual 
     int indice;//variable para el indice de las pilas
     private int a, b;//variables a usar para usar numeros 
     private int d;//variable que almacena resultado anterior
     private String c;//variable para guardar signo actual
     
     
     //constructor
     public PostfixEncDoble(StringBuffer in){
         a=0;
         b=0;
         c="";
         d=0;
         largo=0;
         indice=0;
         caracter="";
         pila=new ListaDoble();
         aux=new ListaDoble();
         //resultado=new Pila();
         resultado=new ArrayList<>();
         linea=in;
         setLargo(linea.length());
         agregar(linea);
         reverso();
         operar();
         RESET();
         
         //logica.setLargo(largo);//envio del largo del stringbuffer de la linea actual a la clase postfix
                //logica.agregar(nlinea);//envio de Stringbuffer a metodo para agregar a pila
                //logica.reverso();//metodo para usar pila auxiliar para dar vuelta a valores
                //logica.operar();//metodo para decodificar la linea de texto y obtener resultados
               
                //logica.RESET();//metodo para vaciar pilas y demas variables
         
     }
     
     //metodo para operar la linea del archivoc>(
     //ingresar valores a pila y operar  para obetener resultado
     public void agregar(StringBuffer milinea){
         linea=milinea;
         for(int i=0;i<largo;i++){
             caracter=linea.substring(i, i+1);
             if(caracter.equals(" ")){
                //System.out.println("hay espacio");
                 
                 //linea.deleteCharAt(i);
                 
             }else{
                 pila.push(caracter);
             }
         }
         
     }
     
     //metodo que mete a pila auxiliar para reordenar
     public void reverso(){
         
         for(indice=pila.getTamano()-1;0<=indice;indice=indice-1){
            aux.push(pila.pop());//el ultimo caracter de 
        
            //pila.pop(); 
         }
         
     }
     //auxiliar ya tiene los valores reordenados
     public void operar(){
         try{
             if(aux.getTamano()%2==0){
                 System.out.println("Error en linea, numero par de caracteres");
             }else{
             
             //validación del formato inicial de un linea
             indice=aux.getTamano()-1;
             /*a=Integer.parseInt(aux.removerSegunIndiceSinAfectar(indice));
             b=Integer.parseInt(aux.removerSegunIndiceSinAfectar(indice-1));
             indice=aux.getTamano()-3;
             c=aux.removerSegunIndiceSinAfectar(indice);
             */
             
             a=Integer.parseInt(aux.pop());
             b=Integer.parseInt(aux.pop());
             //indice=aux.getTamano()-3;
             c=aux.pop();
             
             //d almacena resultado anterior, CUIDADO NO SOBREESCRIBIR
             if(c.equals("+")){
                 d=a+b;
             }else if(c.equals("-")){
                 d=a-b;
             }else if(c.equals("*")){
                 d=a*b;
             }else if(c.equals("/")){
                 d=a/b;
             }else{
                 System.out.println("error en operando, en:"+(indice+1)+" posicion");
             }
             
             //validación del resto de operandos y variables desde la sobreantepenultima posicion, o sea: ultima posision-4
             //for(indice=aux.getTamano()-4;0<indice;indice=indice-2)
             //a=Integer.parseInt(aux.removerSegunIndiceSinAfectar(indice)); //a tendra variables 
             //c=aux.removerSegunIndiceSinAfectar(indice-1);//c tendra los operandos
             
             for(indice=aux.getTamano();0<indice;indice=aux.getTamano()){
               a=Integer.parseInt(aux.pop()); //a tendra variables 
               c=aux.pop();//c tendra los operandos
               
               if(c.equals("+")){
                 d=d+a;
             }else if(c.equals("-")){
                 d=d-a;
             }else if(c.equals("*")){
                 d=a*d;
             }else if(c.equals("/")){
                 d=d/a;
             }else{
                 System.out.println("error en operando, en:"+(indice+1)+" posicion");
             }
               
               
            }
             //guardar valores de d en la pila resultado para mostrar en pantalla
             
             resultado.add(Integer.toString(d));
         } 
             
         }catch(NumberFormatException e){
             System.out.println("error de digito");//imprimir si hay error de poner numero y signo al inicio de linea en datos.txt
         }catch(ArrayIndexOutOfBoundsException a){
             System.out.println("error en formado de linea");//si errores de formato en postfix, ej: 2 1 + 3, falta el operando de * despues de 3
         }
     
         
     }
     
     public void setLargo(int i){
         largo=i;
     }
     
     public String toString(){
         return pila.toString();
     }
     
     public void imprimirPila(){
         pila.imprimir();
         aux.imprimir();
     }
    
     public ArrayList imprimitResultado(){
         return resultado;
     }
    public int getA() {
        return a;
    }

    public int getB() {
        return b;
    }

    public int getD() {//variable resultado de la linea
        return d;
    }

    public String getC() {
        return c;
    }
    
    //metedo para reset de todos los valores para seguir con operaciones de las lineas del archivo datos.txt
    //indice=pila.getSize()-1;0<=indice;indice=indice-1
    public void RESET(){
         
         
         aux.setTamano(aux.getTamano()-1);
         
         
         for(indice=aux.getTamano()-1;0<=indice;indice=indice-1){
           
        aux.limpiar();
            //aux.pop(); 
            //aux.setTamano(aux.getTamano()-1);
         }
         indice=0;
         a=0;
         b=0;
         c="";
         d=0;
         largo=0;
         
         caracter="";
         
     }
     
}
